LINQ (Language Integrated Query) ডেটা কুয়েরি এবং ম্যানিপুলেশনের জন্য একটি শক্তিশালী টুল। LINQ এর মাধ্যমে আপনি বিভিন্ন ধরনের ডেটা সোর্স যেমন ইন-মেমোরি অবজেক্ট, SQL ডেটাবেস, XML, বা DataSet থেকে ডেটা কুয়েরি করতে পারেন। এখানে আমরা কিছু বেসিক LINQ অপারেশন সম্পর্কে আলোচনা করবো, যেগুলি সাধারণত ব্যবহার করা হয়।
Where অপারেশন ব্যবহার করে আপনি ডেটা সোর্স থেকে নির্দিষ্ট শর্তের ভিত্তিতে ডেটা ফিল্টার করতে পারেন। এটি প্রাথমিকভাবে ডেটার মধ্যে শর্তসাপেক্ষ ফিল্টারিং করার জন্য ব্যবহৃত হয়।
উদাহরণ:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Where অপারেশন ব্যবহার করে even সংখ্যাগুলো বের করা
var evenNumbers = numbers.Where(n => n % 2 == 0);
foreach (var num in evenNumbers)
{
Console.WriteLine(num); // Output: 2, 4, 6, 8, 10
}
এখানে Where ব্যবহার করে সংখ্যাগুলোর মধ্যে শুধুমাত্র even numbers ফিল্টার করা হয়েছে।
Select অপারেশন ব্যবহার করে আপনি ডেটা সোর্স থেকে কিছু নির্দিষ্ট ডেটা বা প্রপার্টি নির্বাচন করতে পারেন। এটি সাধারণত ডেটার ট্রান্সফর্মেশনের জন্য ব্যবহৃত হয়।
উদাহরণ:
List<string> names = new List<string> { "Alice", "Bob", "Charlie", "David" };
// Select অপারেশন ব্যবহার করে নামের প্রথম অক্ষর বের করা
var initials = names.Select(name => name[0]);
foreach (var initial in initials)
{
Console.WriteLine(initial); // Output: A, B, C, D
}
এখানে Select ব্যবহার করে নামের প্রথম অক্ষর বের করা হয়েছে।
OrderBy অপারেশন ব্যবহার করে ডেটা সোর্সকে একটি নির্দিষ্ট শর্তের ভিত্তিতে অর্ডার বা সাজানো যায়। এটি সাধারণত অক্ষরিক বা সংখ্যাগত মানের ভিত্তিতে ডেটা সাজানোর জন্য ব্যবহৃত হয়।
উদাহরণ:
List<int> numbers = new List<int> { 5, 1, 8, 3, 9, 4 };
// OrderBy অপারেশন ব্যবহার করে ছোট থেকে বড় সংখ্যায় সাজানো
var sortedNumbers = numbers.OrderBy(n => n);
foreach (var num in sortedNumbers)
{
Console.WriteLine(num); // Output: 1, 3, 4, 5, 8, 9
}
এখানে OrderBy ব্যবহার করে সংখ্যাগুলোর ascending order-এ সাজানো হয়েছে।
GroupBy অপারেশন ব্যবহার করে ডেটা সোর্সের ডেটাগুলিকে একটি বা একাধিক প্রপার্টির ভিত্তিতে গ্রুপ করা যায়। এটি একটি শক্তিশালী অপারেশন যা ডেটার গ্রুপিং বা ক্যাটেগরি তৈরির জন্য ব্যবহৃত হয়।
উদাহরণ:
List<string> fruits = new List<string> { "Apple", "Banana", "Orange", "Apple", "Banana" };
// GroupBy অপারেশন ব্যবহার করে ফলগুলিকে গ্রুপ করা
var groupedFruits = fruits.GroupBy(fruit => fruit);
foreach (var group in groupedFruits)
{
Console.WriteLine($"{group.Key}: {group.Count()}"); // Output: Apple: 2, Banana: 2, Orange: 1
}
এখানে GroupBy ব্যবহার করে ফলগুলিকে গ্রুপ করা হয়েছে এবং প্রতিটি ফলের গুনতি বের করা হয়েছে।
First অপারেশন ব্যবহার করে আপনি একটি ডেটা সোর্সের প্রথম উপাদান বা শর্ত পূরণকারী প্রথম উপাদান নির্বাচন করতে পারেন। এটি সাধারণত সেই ক্ষেত্রে ব্যবহৃত হয় যখন আপনি ডেটা থেকে প্রথম মান চান।
উদাহরণ:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
// First অপারেশন ব্যবহার করে প্রথম even number নির্বাচন করা
var firstEvenNumber = numbers.First(n => n % 2 == 0);
Console.WriteLine(firstEvenNumber); // Output: 2
এখানে First ব্যবহার করে প্রথম even number বের করা হয়েছে।
Sum অপারেশন ব্যবহার করে আপনি একটি ডেটা সোর্সের সমস্ত উপাদানের যোগফল বের করতে পারেন। এটি সাধারণত সংখ্যামূলক ডেটা যেমন ইন্টিজার, ডাবল, ফ্লোট ইত্যাদির সাথে ব্যবহৃত হয়।
উদাহরণ:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
// Sum অপারেশন ব্যবহার করে সকল সংখ্যার যোগফল বের করা
var total = numbers.Sum();
Console.WriteLine(total); // Output: 15
এখানে Sum ব্যবহার করে সংখ্যাগুলির যোগফল বের করা হয়েছে।
Any অপারেশন ব্যবহার করে আপনি ডেটা সোর্সে কোনো শর্ত পূরণকারী উপাদান আছে কিনা তা চেক করতে পারেন। এটি সাধারণত ডেটার মধ্যে কোনো উপাদান বিদ্যমান কিনা তা জানার জন্য ব্যবহৃত হয়।
উদাহরণ:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
// Any অপারেশন ব্যবহার করে চেক করা যে 4 এর চেয়ে বড় কোনো সংখ্যা আছে কিনা
var exists = numbers.Any(n => n > 4);
Console.WriteLine(exists); // Output: True
এখানে Any ব্যবহার করে চেক করা হয়েছে যে 4 এর চেয়ে বড় কোনো সংখ্যা আছে কিনা।
Distinct অপারেশন ব্যবহার করে আপনি ডুপ্লিকেট উপাদান বাদ দিতে পারেন। এটি ডেটা সোর্স থেকে অনুলিপি উপাদানগুলি সরিয়ে ফেলতে সহায়ক।
উদাহরণ:
List<int> numbers = new List<int> { 1, 2, 2, 3, 4, 4, 5 };
// Distinct অপারেশন ব্যবহার করে অনুলিপি উপাদান বাদ দেওয়া
var distinctNumbers = numbers.Distinct();
foreach (var num in distinctNumbers)
{
Console.WriteLine(num); // Output: 1, 2, 3, 4, 5
}
এখানে Distinct ব্যবহার করে ডুপ্লিকেট সংখ্যাগুলো বাদ দেওয়া হয়েছে।
LINQ-এর মাধ্যমে ডেটা সোর্সে বিভিন্ন ধরনের অপারেশন যেমন ফিল্টারিং, সজ্জা, গ্রুপিং, যোগফল, অনুলিপি বাদ দেওয়া ইত্যাদি সহজেই করা যায়। LINQ অপারেশনগুলি ডেভেলপারদের ডেটা ম্যানিপুলেশনকে আরও সহজ এবং পরিষ্কার করে তোলে, যা কোডের রিডেবিলিটি এবং রক্ষণাবেক্ষণযোগ্যতা বৃদ্ধি করে।
LINQ (Language Integrated Query) ব্যবহার করে ডেটা কুয়েরি তৈরি এবং রান করার প্রক্রিয়া সহজ এবং পরিষ্কার। LINQ এর মাধ্যমে, আপনি .NET ভাষা (যেমন C# বা VB.NET) ব্যবহার করে বিভিন্ন ডেটা সোর্সে কুয়েরি লিখতে পারেন। এটি ডেটাবেস, ইন-মেমোরি অবজেক্ট, XML, DataSet ইত্যাদি বিভিন্ন ধরনের ডেটা সোর্সের উপর কার্যকরী।
LINQ কুয়েরি তৈরি করতে এবং রান করার জন্য কিছু প্রধান পদক্ষেপ নিচে বর্ণনা করা হলো:
LINQ কুয়েরি তৈরি করার জন্য Query Syntax এবং Method Syntax দুটি পদ্ধতি ব্যবহার করা যায়। আমরা এই দুটি পদ্ধতিতে কুয়েরি লেখার উদাহরণ দেখবো।
Query Syntax SQL-এর মতোই দেখতে হয় এবং এটি একটি ডিক্লারেটিভ পদ্ধতি। কুয়েরি তৈরির জন্য মূলত from, where, select ইত্যাদি কীওয়ার্ড ব্যবহার করা হয়।
উদাহরণ:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Query Syntax ব্যবহার করে even numbers বের করা
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
foreach (var num in evenNumbers)
{
Console.WriteLine(num); // Output: 2, 4, 6, 8, 10
}
এখানে numbers
লিস্টের মধ্যে যেসব সংখ্যা even (জোড়) তাদের বের করা হয়েছে।
Method Syntax একটি ফাংশনাল পদ্ধতি, যেখানে LINQ মেথড (যেমন Where()
, Select()
, OrderBy()
ইত্যাদি) ব্যবহার করা হয়। এটি খুবই শক্তিশালী এবং সাধারণত Lambda Expressions ব্যবহার করা হয়।
উদাহরণ:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Method Syntax ব্যবহার করে even numbers বের করা
var evenNumbers = numbers.Where(num => num % 2 == 0);
foreach (var num in evenNumbers)
{
Console.WriteLine(num); // Output: 2, 4, 6, 8, 10
}
এখানে Where()
মেথডের মাধ্যমে even numbers বের করা হয়েছে, যেখানে Lambda Expression (num => num % 2 == 0
) ব্যবহার করা হয়েছে।
LINQ কুয়েরি রান করা অর্থাৎ কুয়েরি এক্সিকিউট করা হয় যখন তার ফলাফল প্রয়োজন হয়। LINQ কুয়েরি সাধারণত Deferred Execution সমর্থন করে, অর্থাৎ কুয়েরি তখনই এক্সিকিউট হবে যখন তার ফলাফল অ্যাক্সেস করা হবে।
এটা LINQ এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যেখানে কুয়েরি লেখার পর তা তখনই কার্যকর হয় যখন তার ফলাফল প্রয়োজন হয়, যেমন foreach
লুপে কুয়েরি ব্যবহার করার সময়।
উদাহরণ:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Deferred Execution: কুয়েরি তখনই এক্সিকিউট হবে যখন ফলাফল প্রয়োজন
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
// কুয়েরি এক্সিকিউট করা
foreach (var num in evenNumbers)
{
Console.WriteLine(num); // Output: 2, 4, 6, 8, 10
}
এখানে evenNumbers
কুয়েরি লেখার পর তা এক্সিকিউট হবে foreach
লুপের মধ্যে।
Immediate Execution এর মাধ্যমে কুয়েরি তখনই এক্সিকিউট হয় যখন তা সরাসরি ফলাফল দেয়, যেমন ToList()
, Count()
, First()
ইত্যাদি ব্যবহার করা হলে কুয়েরি ফলাফল আসলেই এক্সিকিউট হয়।
উদাহরণ:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Immediate Execution: কুয়েরি এক্সিকিউট হবে এখনই
var evenNumbersList = numbers.Where(num => num % 2 == 0).ToList();
foreach (var num in evenNumbersList)
{
Console.WriteLine(num); // Output: 2, 4, 6, 8, 10
}
এখানে ToList()
মেথড ব্যবহার করা হয়েছে, যা কুয়েরি লেখার সাথে সাথে তা এক্সিকিউট করে List আকারে ফলাফল প্রদান করে।
একবার কুয়েরি রান হলে, আপনি তার ফলাফলগুলি বিভিন্নভাবে প্রসেস করতে পারেন। এখানে বিভিন্ন কৌশল ব্যবহার করা হতে পারে, যেমন:
উদাহরণ:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Count() ব্যবহার করে even numbers এর সংখ্যা বের করা
var countEven = numbers.Count(num => num % 2 == 0);
Console.WriteLine("Number of even numbers: " + countEven); // Output: 5
// Sum() ব্যবহার করে even numbers এর যোগফল বের করা
var sumEven = numbers.Where(num => num % 2 == 0).Sum();
Console.WriteLine("Sum of even numbers: " + sumEven); // Output: 30
এখানে Count()
এবং Sum()
মেথড ব্যবহার করা হয়েছে, যা even numbers এর সংখ্যা এবং যোগফল বের করেছে।
LINQ তে ফলাফল সাজানোর জন্য OrderBy()
এবং OrderByDescending()
মেথড ব্যবহার করা হয়। এগুলি যথাক্রমে ascending (বৃদ্ধি) এবং descending (হ্রাস) অর্ডারে ফলাফল সাজায়।
উদাহরণ:
List<int> numbers = new List<int> { 10, 3, 7, 4, 1, 8, 5 };
// OrderBy() ব্যবহার করে ascending অর্ডারে সাজানো
var sortedNumbers = numbers.OrderBy(num => num);
foreach (var num in sortedNumbers)
{
Console.WriteLine(num); // Output: 1, 3, 4, 5, 7, 8, 10
}
// OrderByDescending() ব্যবহার করে descending অর্ডারে সাজানো
var sortedNumbersDesc = numbers.OrderByDescending(num => num);
foreach (var num in sortedNumbersDesc)
{
Console.WriteLine(num); // Output: 10, 8, 7, 5, 4, 3, 1
}
এখানে OrderBy()
এবং OrderByDescending()
ব্যবহার করে ascending এবং descending অর্ডারে ফলাফল সাজানো হয়েছে।
LINQ কুয়েরি তৈরি এবং রান করা খুবই সহজ এবং কার্যকর। LINQ এর মাধ্যমে ডেটা কুয়েরি লেখার দুটি প্রধান পদ্ধতি হল Query Syntax এবং Method Syntax। Deferred Execution এবং Immediate Execution এর মাধ্যমে LINQ কুয়েরি এক্সিকিউশন কন্ট্রোল করা যায়। LINQ কুয়েরির মাধ্যমে ডেটা প্রসেস করা, সাজানো এবং গণনা করা যায় খুবই সহজ এবং পরিষ্কারভাবে, যা কোডের রিডেবিলিটি এবং কার্যকারিতা উন্নত করে।
LINQ এর Where ক্লজ ব্যবহার করে আপনি ডেটার মধ্যে একটি নির্দিষ্ট শর্ত পূর্ণকারী উপাদানগুলি ফিল্টার করতে পারেন। এটি একটি সাধারণ এবং শক্তিশালী ফিচার, যা কোডে শর্ত দিয়ে নির্দিষ্ট ডেটা বের করার জন্য ব্যবহৃত হয়। Where ক্লজ সাধারণত কোনো কন্ডিশন বা শর্ত (যেমন সংখ্যা, স্ট্রিং বা অন্য যেকোনো ভ্যালু) নির্ধারণ করার মাধ্যমে ডেটা ফিল্টার করার জন্য ব্যবহার করা হয়।
Where ক্লজ এর মাধ্যমে আপনি ডেটাসেট থেকে এক বা একাধিক শর্তের ভিত্তিতে প্রয়োজনীয় ডেটা নির্বাচন করতে পারবেন। এটি Method Syntax এবং Query Syntax উভয় পদ্ধতিতেই ব্যবহৃত হতে পারে।
Query Syntax ব্যবহার করে Where ক্লজের মাধ্যমে ডেটা ফিল্টার করা খুবই সহজ। যেখানে from
এবং where
এর মধ্যে শর্ত দেওয়া হয়।
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Even numbers বের করা
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
foreach (var num in evenNumbers)
{
Console.WriteLine(num); // Output: 2, 4, 6, 8, 10
}
এখানে Where
ক্লজটি num % 2 == 0
শর্তের মাধ্যমে even numbers বের করার জন্য ব্যবহৃত হয়েছে।
Method Syntax এর মাধ্যমে Where মেথড ব্যবহার করা হয়। এটি LINQ Method Syntax এর অংশ এবং কোডটি আরও компакт এবং সংক্ষিপ্ত করে।
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Even numbers বের করা
var evenNumbers = numbers.Where(num => num % 2 == 0);
foreach (var num in evenNumbers)
{
Console.WriteLine(num); // Output: 2, 4, 6, 8, 10
}
এখানে Where(num => num % 2 == 0)
মেথডটি ফিল্টারিংয়ের জন্য ব্যবহৃত হয়েছে, যেখানে Lambda Expression এর মাধ্যমে শর্ত দেওয়া হয়েছে।
Where ক্লজ ব্যবহার করে একাধিক শর্ত দিয়েও ডেটা ফিল্টার করা যায়। এটি AND বা OR শর্ত দিয়ে করা হতে পারে।
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 5 এর বেশি এবং even সংখ্যা বের করা
var result = numbers.Where(num => num > 5 && num % 2 == 0);
foreach (var num in result)
{
Console.WriteLine(num); // Output: 6, 8, 10
}
এখানে দুটি শর্ত দেয়া হয়েছে: num > 5
এবং num % 2 == 0
(অর্থাৎ সংখ্যা ৫ এর বেশি এবং even হতে হবে)।
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 5 এর বেশি অথবা odd সংখ্যা বের করা
var result = numbers.Where(num => num > 5 || num % 2 != 0);
foreach (var num in result)
{
Console.WriteLine(num); // Output: 1, 3, 5, 6, 7, 8, 9, 10
}
এখানে OR condition দেওয়া হয়েছে: num > 5
অথবা num % 2 != 0
(অর্থাৎ সংখ্যা ৫ এর বেশি অথবা odd হতে হবে)।
Where ক্লজে যেকোনো ধরনের শর্ত ব্যবহার করা যেতে পারে:
List<string> names = new List<string> { "Alice", "Bob", "Charlie", "David", "Eve" };
// "A" অক্ষর দিয়ে শুরু হওয়া নামগুলি বের করা
var result = names.Where(name => name.StartsWith("A"));
foreach (var name in result)
{
Console.WriteLine(name); // Output: Alice
}
এখানে StartsWith("A")
ব্যবহার করা হয়েছে স্ট্রিংয়ের শুরুতে "A" অক্ষর থাকা নামগুলো বের করার জন্য।
Where ক্লজ একটি শক্তিশালী LINQ ফিচার যা ডেটা ফিল্টার করার জন্য ব্যবহৃত হয়। এটি Query Syntax এবং Method Syntax উভয়ই ব্যবহৃত হতে পারে এবং বিভিন্ন শর্তের ভিত্তিতে ডেটা কুয়েরি এবং নির্বাচন করতে সক্ষম। LINQ এর মাধ্যমে ডেটা ফিল্টারিং খুবই সহজ এবং কার্যকরী হয়, যা কোডের রিডেবিলিটি এবং পারফরম্যান্সের উন্নতি করতে সাহায্য করে।
LINQ এর Select ক্লজ একটি অত্যন্ত গুরুত্বপূর্ণ এবং জনপ্রিয় অপারেশন যা একটি সংগ্রহ থেকে নির্দিষ্ট উপাদান নির্বাচন করতে ব্যবহৃত হয়। Select ক্লজটি মূলত Projection Operation হিসাবে কাজ করে, যার মাধ্যমে আপনি একটি নতুন ডেটা সংগ্রহ তৈরি করতে পারেন যা মূল সংগ্রহের এক বা একাধিক উপাদান থেকে নির্বাচিত বা রূপান্তরিত তথ্য ধারণ করে।
Select ক্লজের মাধ্যমে আপনি:
Query Syntax-এ select
কিওয়ার্ড ব্যবহার করে আপনি ডেটা নির্বাচন করেন। এখানে ডেটার উপর কোনো পরিবর্তন বা ফিল্টার প্রয়োগ করতে পারেন এবং নতুন ডেটা গঠন করতে পারেন।
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
// প্রতি সংখ্যার গুণফল বের করা
var squares = from num in numbers
select num * num;
foreach (var square in squares)
{
Console.WriteLine(square); // Output: 1, 4, 9, 16, 25, 36
}
এখানে, select
ক্লজটি num * num করে প্রতিটি সংখ্যা থেকে তার গুণফল বের করেছে।
Method Syntax-এ Select()
মেথড ব্যবহার করা হয়, যা LINQ এর এক ধরনের ফাংশনাল স্টাইল। এটি Lambda Expressions ব্যবহার করে ডেটা নির্বাচন ও রূপান্তর করার সুবিধা দেয়।
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
// প্রতি সংখ্যার গুণফল বের করা
var squares = numbers.Select(num => num * num);
foreach (var square in squares)
{
Console.WriteLine(square); // Output: 1, 4, 9, 16, 25, 36
}
এখানে, Select(num => num * num)
মাধ্যমে প্রতিটি সংখ্যা তার গুণফলে রূপান্তরিত হয়েছে।
Select ক্লজ ব্যবহার করে আপনি নতুন কাস্টম অবজেক্ট তৈরি করতে পারেন, যা মূল অবজেক্টের প্রোপার্টি বা ফিল্ডের ভিত্তিতে নির্মিত হয়।
List<Person> people = new List<Person>
{
new Person { Name = "Alice", Age = 25 },
new Person { Name = "Bob", Age = 30 },
new Person { Name = "Charlie", Age = 35 }
};
// কাস্টম অবজেক্ট তৈরি
var selectedPeople = people.Select(p => new { p.Name, AgeInFiveYears = p.Age + 5 });
foreach (var person in selectedPeople)
{
Console.WriteLine($"Name: {person.Name}, Age in 5 years: {person.AgeInFiveYears}");
}
এখানে, Select
ক্লজের মাধ্যমে একটি নতুন anonymous object তৈরি করা হয়েছে, যেখানে Name এবং AgeInFiveYears (এলিয়াস হিসেবে) ফিল্ড রয়েছে।
Select ক্লজ ব্যবহার করে আপনি একাধিক স্তরের (nested) ডেটা নির্বাচন করতে পারেন। এই পদ্ধতিতে একটি ডেটা অবজেক্টের মধ্যে থাকা অন্য ডেটা অবজেক্ট বা সংগ্রহের তথ্য নির্বাচন করা হয়।
List<Order> orders = new List<Order>
{
new Order { OrderId = 1, Customer = "Alice", Items = new List<string> { "Item1", "Item2" } },
new Order { OrderId = 2, Customer = "Bob", Items = new List<string> { "Item3", "Item4" } },
new Order { OrderId = 3, Customer = "Charlie", Items = new List<string> { "Item5", "Item6" } }
};
// প্রতিটি অর্ডারের আইটেমসমূহ নির্বাচন করা
var orderItems = orders.Select(o => new { o.Customer, Items = string.Join(", ", o.Items) });
foreach (var order in orderItems)
{
Console.WriteLine($"Customer: {order.Customer}, Items: {order.Items}");
}
এখানে Order ক্লাসের মধ্যে থাকা Items নামক লিস্ট থেকে প্রতিটি অর্ডারের আইটেমগুলো একত্রিত করে একটি নতুন তথ্য তৈরি করা হয়েছে।
Select
ক্লজ ব্যবহার করে আপনি স্ট্রিং ডেটার মধ্যে রূপান্তর করতে পারেন, যেমন স্ট্রিংয়ের অক্ষর পরিবর্তন বা স্ট্রিংয়ের অংশ নির্বাচন।
List<string> names = new List<string> { "alice", "bob", "charlie" };
// নামগুলো বড় হাতের অক্ষরে রূপান্তর করা
var upperNames = names.Select(name => name.ToUpper());
foreach (var name in upperNames)
{
Console.WriteLine(name); // Output: ALICE, BOB, CHARLIE
}
এখানে, প্রতিটি নামকে uppercase এ রূপান্তর করা হয়েছে Select
ক্লজের মাধ্যমে।
Select
ক্লজ ব্যবহার করে আপনি ডেটার উপর ভিত্তি করে গণনা বা মোট কিছু হিসাব করতে পারেন।
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
// সংখ্যাগুলোর মোট যোগফল বের করা
var totalSum = numbers.Select(num => num).Sum();
Console.WriteLine(totalSum); // Output: 21
এখানে, Select(num => num)
থেকে সমস্ত সংখ্যা নির্বাচন করে তাদের যোগফল বের করা হয়েছে।
Select ক্লজ LINQ এর একটি গুরুত্বপূর্ণ ফিচার, যা ডেটাকে ফিল্টার বা রূপান্তর করার জন্য ব্যবহৃত হয়। এটি ব্যবহারে ডেটার একাধিক শর্ত, কাস্টম অবজেক্ট তৈরি, এবং সংখ্যার বা স্ট্রিংয়ের উপর রূপান্তর করা সহজ এবং কার্যকর হয়।
LINQ-এ অর্ডারিং কুয়েরি অপারেশন ডেটাকে নির্দিষ্ট ক্রমে সাজানোর জন্য ব্যবহৃত হয়। OrderBy এবং OrderByDescending হল দুটি প্রধান LINQ অপারেটর যা ডেটাকে যথাক্রমে Ascending (বৃদ্ধি) বা Descending (হ্রাস) অর্ডারে সাজাতে ব্যবহৃত হয়।
OrderBy কুয়েরি অপারেটর ডেটাকে Ascending Order বা ছোট থেকে বড় (কম থেকে বেশি) সাজানোর জন্য ব্যবহৃত হয়। এটি সাধারণত সংখ্যার বা অক্ষরের ক্রম অনুযায়ী ডেটা সাজানোর জন্য ব্যবহার করা হয়।
ধরা যাক, আমাদের একটি Customer ক্লাস রয়েছে এবং আমরা Customer লিস্টের মধ্যে Age ফিল্ড অনুযায়ী ক্রমবর্ধমানভাবে সাজাতে চাই:
public class Customer
{
public string Name { get; set; }
public int Age { get; set; }
}
List<Customer> customers = new List<Customer>
{
new Customer { Name = "Alice", Age = 30 },
new Customer { Name = "Bob", Age = 25 },
new Customer { Name = "Charlie", Age = 35 }
};
// OrderBy ব্যবহার করে Ascending Order এ সাজানো
var orderedCustomers = customers.OrderBy(c => c.Age);
foreach (var customer in orderedCustomers)
{
Console.WriteLine($"{customer.Name}, Age: {customer.Age}");
}
আউটপুট:
Bob, Age: 25
Alice, Age: 30
Charlie, Age: 35
এখানে OrderBy Age
অনুযায়ী Ascending Order-এ ডেটা সাজাচ্ছে।
OrderByDescending কুয়েরি অপারেটর ডেটাকে Descending Order বা বড় থেকে ছোট (বেশি থেকে কম) সাজানোর জন্য ব্যবহৃত হয়।
ধরা যাক, এবার আমরা Age ফিল্ড অনুযায়ী ডেটাকে Descending Order-এ সাজাতে চাই:
// OrderByDescending ব্যবহার করে Descending Order এ সাজানো
var orderedCustomersDesc = customers.OrderByDescending(c => c.Age);
foreach (var customer in orderedCustomersDesc)
{
Console.WriteLine($"{customer.Name}, Age: {customer.Age}");
}
আউটপুট:
Charlie, Age: 35
Alice, Age: 30
Bob, Age: 25
এখানে OrderByDescending Age
অনুযায়ী Descending Order-এ ডেটা সাজাচ্ছে, অর্থাৎ বড় থেকে ছোট।
কখনও কখনও, একাধিক শর্তে ডেটা সাজানো প্রয়োজন হয়, যেমন প্রথমে একটি ফিল্ডের উপর এবং তারপর অন্য একটি ফিল্ডের উপর অর্ডারিং করা। LINQ এ একাধিক শর্তে অর্ডারিং করার জন্য ThenBy এবং ThenByDescending ব্যবহার করা যায়।
var orderedCustomersMulti = customers
.OrderBy(c => c.Age) // প্রথমে Age অনুযায়ী Ascending Order
.ThenBy(c => c.Name); // এরপর Name অনুযায়ী Ascending Order
foreach (var customer in orderedCustomersMulti)
{
Console.WriteLine($"{customer.Name}, Age: {customer.Age}");
}
আউটপুট:
Bob, Age: 25
Alice, Age: 30
Charlie, Age: 35
এখানে প্রথমে Age অনুযায়ী Ascending Order-এ সাজানো হয়েছে, এবং তারপর Name অনুযায়ী Ascending Order-এ সাজানো হয়েছে।
OrderBy এবং OrderByDescending LINQ-এ ডেটাকে ক্রম অনুযায়ী সাজানোর দুটি মূল অপারেটর। এগুলি Ascending এবং Descending অর্ডারে ডেটা সাজাতে ব্যবহৃত হয়, এবং একাধিক শর্তে সাজাতে ThenBy ও ThenByDescending ব্যবহার করা যায়। এগুলি LINQ কুয়েরি অপারেশনগুলোকে আরও শক্তিশালী এবং কার্যকরী করে তোলে।
LINQ to DataSet এ Group By অপারেটর ব্যবহার করে আপনি ডেটাকে নির্দিষ্ট একটি বা একাধিক কন্ডিশনের উপর গ্রুপ করতে পারেন। এটি SQL-এর GROUP BY
এর সমান, যেখানে আপনি ডেটাকে একটি নির্দিষ্ট ফিল্ড বা কন্ডিশনের মাধ্যমে গ্রুপ করেন এবং তারপর প্রতিটি গ্রুপের উপর কোনো অপারেশন যেমন Sum, Count, Average ইত্যাদি প্রয়োগ করতে পারেন।
LINQ-এর group by
ক্লজ ব্যবহার করে DataTable বা DataSet-এর ডেটা গ্রুপ করা যায় এবং এই গ্রুপগুলির উপর বিভিন্ন ধরনের অ্যাগ্রিগেট ফাংশনও প্রয়োগ করা সম্ভব।
ধরা যাক, আপনার কাছে একটি পণ্য (Product) সম্পর্কিত ডেটা রয়েছে এবং আপনি সেই ডেটা পণ্যের Category অনুযায়ী গ্রুপ করতে চান।
using System;
using System.Data;
using System.Linq;
class Program
{
static void Main()
{
// DataTable তৈরি
DataTable dt = new DataTable("Products");
dt.Columns.Add("ProductID", typeof(int));
dt.Columns.Add("ProductName", typeof(string));
dt.Columns.Add("Category", typeof(string));
dt.Columns.Add("Price", typeof(decimal));
// DataTable-এ ডেটা ইনসার্ট করা
dt.Rows.Add(1, "Product1", "Category1", 20.5);
dt.Rows.Add(2, "Product2", "Category1", 30.0);
dt.Rows.Add(3, "Product3", "Category2", 15.5);
dt.Rows.Add(4, "Product4", "Category2", 25.0);
// LINQ কুয়েরি দিয়ে Category অনুসারে গ্রুপিং করা
var groupedProducts = from product in dt.AsEnumerable()
group product by product.Field<string>("Category") into productGroup
select new
{
Category = productGroup.Key,
Products = productGroup
};
// গ্রুপড ডেটা প্রিন্ট করা
foreach (var group in groupedProducts)
{
Console.WriteLine($"Category: {group.Category}");
foreach (var product in group.Products)
{
Console.WriteLine($" - {product.Field<string>("ProductName")}: {product.Field<decimal>("Price")}");
}
}
}
}
আউটপুট:
Category: Category1
- Product1: 20.5
- Product2: 30
Category: Category2
- Product3: 15.5
- Product4: 25
এখানে Category কলামের ভিত্তিতে পণ্যগুলো গ্রুপ করা হয়েছে, এবং তারপর প্রতিটি গ্রুপের পণ্যগুলোর নাম ও মূল্য প্রদর্শিত হয়েছে।
আপনি group by
এর সাথে Sum, Count, Average ইত্যাদি অ্যাগ্রিগেট ফাংশন ব্যবহার করতে পারেন। নিচে একটি উদাহরণ দেয়া হলো যেখানে Category অনুসারে গ্রুপিং করার পর প্রতিটি গ্রুপের মোট মূল্য (Sum) হিসাব করা হয়েছে।
using System;
using System.Data;
using System.Linq;
class Program
{
static void Main()
{
// DataTable তৈরি
DataTable dt = new DataTable("Products");
dt.Columns.Add("ProductID", typeof(int));
dt.Columns.Add("ProductName", typeof(string));
dt.Columns.Add("Category", typeof(string));
dt.Columns.Add("Price", typeof(decimal));
// DataTable-এ ডেটা ইনসার্ট করা
dt.Rows.Add(1, "Product1", "Category1", 20.5);
dt.Rows.Add(2, "Product2", "Category1", 30.0);
dt.Rows.Add(3, "Product3", "Category2", 15.5);
dt.Rows.Add(4, "Product4", "Category2", 25.0);
// LINQ কুয়েরি দিয়ে Category অনুসারে গ্রুপিং এবং মোট মূল্য বের করা
var groupedProducts = from product in dt.AsEnumerable()
group product by product.Field<string>("Category") into productGroup
select new
{
Category = productGroup.Key,
TotalPrice = productGroup.Sum(p => p.Field<decimal>("Price"))
};
// গ্রুপড ডেটার মোট মূল্য প্রিন্ট করা
foreach (var group in groupedProducts)
{
Console.WriteLine($"Category: {group.Category}, Total Price: {group.TotalPrice}");
}
}
}
আউটপুট:
Category: Category1, Total Price: 50.5
Category: Category2, Total Price: 40.5
এখানে প্রতিটি Category এর জন্য পণ্যের মোট মূল্য হিসাব করা হয়েছে।
আপনি Count ফাংশনও ব্যবহার করতে পারেন গ্রুপের মধ্যে কতটি রেকর্ড আছে তা গণনা করতে।
using System;
using System.Data;
using System.Linq;
class Program
{
static void Main()
{
// DataTable তৈরি
DataTable dt = new DataTable("Products");
dt.Columns.Add("ProductID", typeof(int));
dt.Columns.Add("ProductName", typeof(string));
dt.Columns.Add("Category", typeof(string));
dt.Columns.Add("Price", typeof(decimal));
// DataTable-এ ডেটা ইনসার্ট করা
dt.Rows.Add(1, "Product1", "Category1", 20.5);
dt.Rows.Add(2, "Product2", "Category1", 30.0);
dt.Rows.Add(3, "Product3", "Category2", 15.5);
dt.Rows.Add(4, "Product4", "Category2", 25.0);
// LINQ কুয়েরি দিয়ে Category অনুসারে গ্রুপিং এবং প্রতি গ্রুপে পণ্যের সংখ্যা বের করা
var groupedProducts = from product in dt.AsEnumerable()
group product by product.Field<string>("Category") into productGroup
select new
{
Category = productGroup.Key,
ProductCount = productGroup.Count()
};
// গ্রুপড ডেটার পণ্যের সংখ্যা প্রিন্ট করা
foreach (var group in groupedProducts)
{
Console.WriteLine($"Category: {group.Category}, Product Count: {group.ProductCount}");
}
}
}
আউটপুট:
Category: Category1, Product Count: 2
Category: Category2, Product Count: 2
এখানে প্রতিটি Category এর মধ্যে কতটি পণ্য আছে তা গুনে দেখানো হয়েছে।
LINQ to DataSet-এ Group By অপারেটর ব্যবহার করে আপনি DataTable বা DataSet এর ডেটাকে একটি বা একাধিক কলামের ভিত্তিতে গ্রুপ করতে পারেন এবং তারপর সেই গ্রুপগুলির উপর অ্যাগ্রিগেট ফাংশন প্রয়োগ করতে পারেন, যেমন Sum, Count, Average ইত্যাদি। এটি আপনাকে ডেটাকে বিশ্লেষণ করতে এবং বিভিন্ন গ্রুপের তথ্য একত্রিত করতে সহায়ক।
common.read_more